
-- 获取锁的key，即: KEY_PREFIX + name
local key = KEYS[1];
-- 获取当前线程的标识, 即: ID_PREFIX + Thread.currentThread().getId()
local threadId = ARGV[1];
-- 锁的有效期
local releaseTime = ARGV[2];

-- 判断缓存中是否存在锁
if (redis.call('EXISTS', key) == 0) then
    -- 不存在，获取锁
    redis.call('HSET', key, threadId, '1');
    -- 设置锁的有效期
    redis.call('EXPIRE', key, releaseTime);
    return 1; -- 返回1表示锁获取成功
end

-- 缓存中已存在锁，判断threadId是否说自己的
if (redis.call('HEXISTS', key, threadId) == 1) then
    -- 是自己的锁，获取锁然后重入次数+1
    redis.call('HINCRBY', key, threadId, '1');
    -- 设置有效期
    redis.call('EXPIRE', key, releaseTime);
    return 1; -- 返回1表示锁获取成功
end

-- 锁不是自己的，直接返回0，表示锁获取失败
return 0;
